import _ from 'lodash'

//使用递归实现深拷贝
export function deepClone(obj) {
	// console.log('obj ==> ', obj);
	//判断拷贝的obj是对象还是数组
	var objClone = Array.isArray(obj) ? [] : {};
	if (obj && typeof obj === "object") { //obj不能为空，并且是对象或者是数组 因为null也是object
		for (let key in obj) {
			if (obj.hasOwnProperty(key)) {
				if (obj[key] && typeof obj[key] === "object") { //obj里面属性值不为空并且还是对象，进行深度拷贝
					objClone[key] = deepClone(obj[key]); //递归进行深度的拷贝
				} else {
					objClone[key] = obj[key]; //直接拷贝
				}
			}
		}
	}
	return objClone;
}

export function urlToObj(url) {
	let obj = {}
	let str = url.slice(url.indexOf('?') + 1)
	let arr = str.split('&')
	for (let j = arr.length, i = 0; i < j; i++) {
		let arr_temp = arr[i].split('=')
		obj[arr_temp[0]] = arr_temp[1]
	}
	return obj
}

//判空，为空返回true
export function isEmpty(obj) {
	return _.isEmpty(obj)
}

// 跳转
export function navTo(args) {
	const {
		url,
		_params = {},
		_callback,
		_isLogin = false, // 要跳转的地址 是否需要登录
	} = args
	// 如果需要登陆 并且没有登陆
	if (_isLogin && !getUserinfo()) {
		alert("请先去登陆");
		return;
	}

	// 构建查询参数
	const params = buildQueryParams(_params);
	// 添加查询参数到 URL
	const fullUrl = `${url}?${params.toString()}`;
	// 跳转核心
	uni.navigateTo({
		url: fullUrl,
		success: () => {
			// 跳转成功后执行回调
			_callback && _callback();
		},
		fail: (err) => {
			console.error('跳转失败:', err);
		}
	});
}

// switchTab跳转
export function sgoto(url, params = {}) {
	// 如果有参数 emit 表示要发送 uni.$emit
	if ('emit' in params) {
		// emit 必须是一个对象
		const D = params.emit;
		for (const K in D) {
			if (D.hasOwnProperty(K)) {
				uni.$emit(K, D[K]);
			}
		}
	}

	// 跳转核心
	uni.switchTab({
		url,
		success: () => {
			// 跳转成功后可以执行其他操作
		},
		fail: (err) => {
			console.error('跳转失败:', err);
		}
	});
}

export function replaceCurrentRoute({
	url,
	_params = {},
	_callback,
	_isLogin = false, // 要跳转的地址 是否需要登录
}) {
	// 如果需要登陆 并且没有登陆
	if (_isLogin && !getUserinfo()) {
		alert("请先去登陆");
		return;
	}

	// 构建查询参数
	const params = buildQueryParams(_params);
	// 添加查询参数到 URL
	const fullUrl = `${url}?${params.toString()}`;

	// 替换当前页面
	uni.redirectTo({
		url: fullUrl,
		success: () => {
			// 替换成功后执行回调
			_callback && _callback();
		},
		fail: (err) => {
			console.error('替换失败:', err);
		}
	});
}

export function rgoto(url) {
	uni.reLaunch({
		url
	})
}

export function buildQueryParams(params) {
	const queryParts = [];
	for (const key in params) {
		if (params.hasOwnProperty(key)) {
			queryParts.push(`${encodeURIComponent(key)}=${encodeURIComponent(params[key])}`);
		}
	}
	return queryParts.join('&');
}

// 返回
export function navBack(delta = 1) {
	uni.navigateBack({
		delta
	})
}
// 模块开发中
export function createing() {
	uni.showToast({
		title: '该模块正在开发中...',
		icon: 'none'
	})
}

// 图片地址
export function getImgSrc(img, boo = false) {
	// boo true 表示读取本地图片 打包时需要注释掉
	// 测试为prefix 为空	
	let prefix = ''
	prefix = 'https://syzx.s3.cn-northwest-1.amazonaws.com.cn/yhsc_image'
	return !boo ? `${prefix}${img}` : img
}

export function setLoadingToast(title, params, mask = true) {
	uni.showLoading({
		title,
		...params,
		mask
	})
}

export function setToast(title, icon = 'none') {
	uni.hideToast()
	uni.showToast({
		title,
		icon,
		duration: 2000
	})
}

// 节流
export function throttle(fn, inter = 500) {
	let timer = null;
	return function() {
		if (timer) {
			return;
		}
		timer = setTimeout(() => {
			//执行操作(使用apply重新绑定this的指向)
			fn.apply(this, arguments);
			timer = null;
		}, 1000)
	}
}

// 赋值
export function copy(data) {
	data = data.toString()
	uni.setClipboardData({
		data, //要被复制的内容
		success: () => { //复制成功的回调函数
		},
		fail(e) {
			// console.log('e fail ==> ', e);
		}
	});
}

// 生成随机ID
export function randomString(length) {
	let result = ''
	const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
	const charactersLength = characters.length

	for (let i = 0; i < length; i++) {
		result += characters.charAt(Math.floor(Math.random() * charactersLength))
	}

	return result
}

// 检查版本并更新
export const checkVersion = (openToast = false) => {
	upgrade.checkVersion().then((res) => {
		const {
			isLatest,
			version,
			args
		} = res;
		// 如果版本不一致，需要更新
		if (isLatest) {
			appUpdate.check({
				title: '检测到有新版本！',
				downloadUrl: args.apkUrl,
				versionName: version,
				versionInfo: '1.修复了已知问题\n2.优化了部分功能模块'
			});
		} else {
			if (openToast) setToast("您已是新版本")
		}
	});
}

// 获取本地版本
export const getLocationVersion = async () => {
	const version = await upgrade.getLocalVersion()
	// console.log('version =====================》 ', version);
	return version
}

//  默认查询半年的日期
export const getHalfYearRange = () => {
	const today = new Date();
	// 创建一个新的 Date 实例，用于表示半年前的今天 (00:00:00)
	const startOfHalfYear = new Date(today);
	startOfHalfYear.setMonth(today.getMonth() - 6);
	startOfHalfYear.setHours(0, 0, 0, 0);
	// 创建一个新的 Date 实例，用于表示今天的结束时间 (23:59:59)
	const endOfToday = new Date(today);
	endOfToday.setHours(23, 59, 59, 999); // 设置为一天的最后一毫秒
	// 定义一个函数来格式化日期为 YYYY-MM-DD HH:mm:ss 格式
	function formatDate(date) {
		const year = date.getFullYear();
		const month = String(date.getMonth() + 1).padStart(2, '0'); // 月份从0开始计数
		const day = String(date.getDate()).padStart(2, '0');
		const hours = String(date.getHours()).padStart(2, '0');
		const minutes = String(date.getMinutes()).padStart(2, '0');
		const seconds = String(date.getSeconds()).padStart(2, '0');
		return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
	}
	return [formatDate(startOfHalfYear), formatDate(endOfToday)];
}

// Knuth 洗牌算法
export const shuffleArray = (array) => {
	for (let i = array.length - 1; i > 0; i--) {
		// 生成一个从 0 到 i 的随机索引 j
		const j = Math.floor(Math.random() * (i + 1));
		// 交换元素 array[i] 和 array[j]
		[array[i], array[j]] = [array[j], array[i]];
	}
	return array;
};

export const dynamicPs = () => {
	// 获取当前设备信息
	const systemInfo = uni.getSystemInfoSync();

	// 动态计算比例（核心修正）
	const scaleX = systemInfo.windowWidth / 750; // 750rpx = 100%宽度
	const scaleY = systemInfo.windowHeight / (systemInfo.windowHeight * (750 / systemInfo.windowWidth)); // 按宽高比计算
	return {
		scaleX,
		scaleY,
		barHeight: systemInfo.statusBarHeight
	}
}

export const clearCache = () => {
	// 使用plus.cache.calculate 获取应用的缓存大小，
	let all
	plus.cache.calculate((size) => { //size是多少个字节单位是b
		//你可以做下面相应的处理
		if (size < 1024) {
			all = size + 'B';
		} else if (size / 1024 >= 1 && size / 1024 / 1024 < 1) {
			all = Math.floor(size / 1024 * 100) / 100 + 'KB';
		} else if (size / 1024 / 1024 >= 1) {
			all = Math.floor(size / 1024 / 1024 * 100) / 100 + 'M';
		}
		//可以询问用户是否删除
		uni.showModal({
			title: '提示',
			content: `确定清除缓存吗?缓存大小${all}.`,
			success(res) {
				// 用户确定要删除
				if (res.confirm) {
					//使用plus.cache.clear 清除应用中的缓存数据 这里清除后还要二十几KB没有清除，达不到全部清除
					plus.cache.clear(function() {
						setToast('清除成功')
					});
				}
			}
		})
	});
}